package controlador.buzones;

import java.util.LinkedList;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import util.AgregadorRMI;

/**
 * 
 * @author Globex Inc.
 *
 */

public class Buzon extends UnicastRemoteObject implements BuzonIface {
	
	/**
	 * Numero de serie de esta clase
	 */
	private static final long serialVersionUID = 4L;
	
	/**
	 * Cola con los mensajes.
	 */
	private LinkedList<Mensaje> _mensajes;
	
	
	public Buzon() throws RemoteException{
		super();
		_mensajes = new LinkedList<Mensaje>();
	}
	
	
	/**
	 * Agrega un mensaje al buz&oacute;n.
	 * @param msj Mensaje a encolar.
	 * @return true si se ha agregado correctamente. En caso cotrario devuelve false.
	 * @throws RemoteException
	 */
	public synchronized boolean encolar(Mensaje msj) {
		return _mensajes.offer(msj);
	}
	
	
	/**
	 * Obtiene el primer mensaje disponible en la cola de mensajes.
	 * Elimina dicho mensaje de la cola.
	 * @return El primer mensaje disponible en en la cola.
	 * @throws RemoteException
	 */
	public synchronized Mensaje desencolar() {
		return _mensajes.poll();
	}
	
	
	/**
	 * Comprueba si hay mensajes en el buz&oacute;n.
	 * @return true si el buz&oacute;n est&aacute; vac&iacute;o. En caso contrario devuelve false.
	 * @throws RemoteException
	 */
	public synchronized boolean isEmpty() {
		// TODO usar esto o size?
		return _mensajes.peek() == null;
	}
	
	/**
	 * Eliminina todos los mensajes del buz&oacute;n.
	 * @throws RemoteException
	 */
	public synchronized void vaciar() {
		_mensajes.clear();
	}
	
	/**
	 * Publica en buz&oacute;n como un objeto RMI.
	 * @param port Puerto donde se publica.
	 * @param id Ruta de la URL donde se publica
	 * @return true si se ha publicado correctamente. En caso contrario devuelve false.
	 * @throws RemoteException
	 */
	public synchronized boolean registrar(int port, String id) {
		try {
			AgregadorRMI.iniciarRegistro(port);
			AgregadorRMI.agregar(this, id, port);
			return true;
		} catch (RemoteException e) {
			e.printStackTrace();
			return false;
		} catch (MalformedURLException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/*public synchronized boolean desregistrar exit() throws RemoteException {
	    try{
	        // Unregister ourself
	        Naming.unbind(mServerName);

	        // Unexport; this will also remove us from the RMI runtime
	        UnicastRemoteObject.unexportObject(this, true);

	        System.out.println("CalculatorServer exiting.");
	    }
	    catch(Exception e){}
	}*/
}
